#ifndef TYPES_H
#define TYPES_H

#include "Framework/StdHeaders.h"
#include "Framework/Definitions.h"

#if TYRO_DEFINITION == TYRO_DEFINITION_WIN32
#include <assert.h>
#include <windows.h>
#endif


namespace tyro
{

		/* 32 bit floating point variable */
		typedef float FLOAT_32;

		/* 64 bit floating point variable */
		typedef double FLOAT_64;

		/* 8 bit Unsigned INT */
		typedef unsigned char UINT_8;

		/* 16 bit Unsigned INT */
		typedef unsigned short UINT_16;


#if TYRO_DEFINITION == TYRO_DEFINITION_WIN32

		/* 32 bit Unsigned INT */
		typedef unsigned __int32 UINT_32;

		/* 64 bit Unsigned INT */
		typedef unsigned __int64 UINT_64;

		/* 32 Signed INT */
		typedef signed __int32 INT_32;

		/* 64 Signed INT */
		typedef signed __int64 INT_64;

#elif TYRO_DEFINITION == TYRON_DEFINITION_ANDROID

		/* 32 bit Unsigned INT */
		typedef unsigned uint32_t UINT_32;

		/* 64 bit Unsigned INT */
		typedef unsigned uint64_t UINT_64;

		/* 32 Signed INT */
		typedef signed int32_t INT_32;

		/* 64 Signed INT */
		typedef signed int64_t INT_64;

#endif

		/* Signed Short */
		typedef signed short SHORT_16;

		/* Unsigned Short */
		typedef unsigned short USHORT_16;

		/* Unsigned Char */
		typedef unsigned char UCHAR_32;

		/* Unsigned Long */
		typedef unsigned long ULONG_32;

		typedef std::string String;

		template < typename T >
		struct deque
		{
			typedef typename std::deque<T> type;
			typedef typename std::deque<T>::iterator iterator;
			typedef typename std::deque<T>::const_iterator const_iterator;
		};

		template <typename T, typename P = std::less<T> >
		struct set
		{
			typedef typename std::set<T, P> type;
			typedef typename std::set<T, P>::iterator iterator;
			typedef typename std::set<T, P>::const_iterator const_iterator;
		};

		template <typename K, typename V, typename P = std::less<K> > 
		struct map 
		{ 
			typedef typename std::map<K, V, P> type;
			typedef typename std::map<K, V, P>::iterator iterator;
			typedef typename std::map<K, V, P>::const_iterator const_iterator;
		};

		template <typename K, typename V, typename P = std::less<K> > 
		struct multimap 
		{ 
			typedef typename std::multimap<K, V, P> type;
			typedef typename std::multimap<K, V, P>::iterator iterator;
			typedef typename std::multimap<K, V, P>::const_iterator const_iterator;
		};


		/* Defines the buffer type flags */
		enum BufferFlagType
		{
			BUFF_TYPE_COLOUR	= 0x1,
			BUFF_TYPE_DEPTH		= 0x2,
			BUFF_TYPE_STENCIL	= 0x4
		};

		/* Defines projection types */
		enum ProjectionType
		{
			PT_ORTHOGRAPHIC,
			PT_PERSPECTIVE
		};
}

#endif
